<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Variables and Expressions</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="alternate" type="application/rss+xml" title="AutoHotkey Forum RSS" href="../forum/rss.php">
<link href="css/default.css" rel="stylesheet" type="text/css">
</head>

<body>
<h1>变量和表达式</h1>

<h2>目录</h2>
<ul>
  <li><a href="#Variables">变量</a></li>
  <li><a href="#Expressions">表达式</a></li>
  <li><a href="#Operators">表达式中的运算符</a><a href="#env"></a></li>
  <li><a href="#BuiltIn">内置变量</a></li>
  <li><a href="#env">环境变量与 普通变量</a></li>
  <li><a href="#cap">变量的容量和占用内存</a></li>
</ul>
<h2 id="Intro"><a name="Variables"></a>变量</h2>
<p><strong>变量的类型</strong>: AutoHotkey 中没有清晰明确的变量类型, 所有的变量都是以字符串的形式存储. 然而, 当一个只包含数字 (可以含有小数点) 的变量进行数学运算或比较时, 会被自动转换为数值. (为了提高性能, 在内部对数字进行缓存以避免与字符串之间的转换.)</p>
<p><strong>变量的作用域和声明</strong>: 除了函数中的 <a href="Functions.htm#Locals">局部变量</a>, 其他所有变量都是全局的; 即它们的内容可以在脚本的任意位置读取或修改. 除了在 <a href="Functions.htm#Global">函数页面</a> 注明的情况, 变量是无需声明的; 使用它们的时候它们就产生了 (每个变量初始为空).</p>
<p><strong>变量的名称</strong>: 变量名不区分大小写 (例如, <em>CurrentDate</em> 等同于 <em>currentdate</em>). 变量名可以含有多达 253 字符, 并且可以由字母, 数字以及后面的标点组成: # _ @ $</p>
<p>考虑到命名的惯例, 通常在命名变量时最好仅使用字母, 数字和下划线 (例如: <em>CursorPosition</em>, <em>Total_Items</em> 和 <em>entry_is_valid</em>). 这样的风格可以让熟悉其他计算机语言的人更容易理解你的脚本. 而且, 如果你在 AutoHotkey 和其他语言中使用相同的风格, 你会发现能更容易重新读懂自己的脚本.</p>
<p>尽管变量名称可以完全由数字组成, 但通常这样的变量名仅用于 <a href="Scripts.htm#cmd">传入的命令行参数</a>. 这样数值的名称不能用在 <a href="#Expressions">表达式</a> 中, 因为它们会被看成是数字而不是变量.</p>
<p>因为单词 <em>AND</em>, <em>OR</em> 和 <em>NOT</em> 作为表达式中的 <a href="#Operators">运算符</a> 使用, 所以通常不应该把它们作为变量名使用. 在表达式中使用这样的名称将阻碍正确的计算.</p>
<p><strong>给变量赋值</strong>: 要把字符串或数字保存到变量中, 有两种方法: 传统方法和表达式方法. 传统的方法使用 <a href="commands/SetEnv.htm">等号运算符 (=)</a> 来指定 <strong>未引用的</strong> 原义字符串或包围在百分号中的变量. 例如:</p>
<pre>MyNumber = 123
MyString = This is a literal string.
CopyOfVar = %Var%  <em>; 和 = 运算符一起使用时, 需要使用百分号来获取变量的内容.</em></pre>
<p> 与之相比, 表达式方法使用 <a href="commands/SetExpression.htm">冒号等号运算符 (:=)</a> 来保存数字, <strong>引用的</strong> 字符串和其他类型的 <a href="#Expressions">表达式</a>. 下面的例子在功能上与前面的例子相同:</p>
<pre>MyNumber := 123
MyString := "This is a literal string."
CopyOfVar := Var  <em>; 和前面段落中与其作用相同的语句不同, 百分号不和 := 运算符一起使用.</em></pre>
<p>后一种方法由于其更清晰并且与其他许多语言几乎一致的 <a href="#Expressions">表达式语法</a> 成为大多数人的首选方法.</p>
<p>从上面的例子中你可能已经猜到了有两种方法来清除一个变量的内容 (即使变量为空):</p>
<pre>MyVar =
MyVar := &quot;&quot;</pre>
<p>上面的这对空引号只能和 := 运算符一起使用, 因为如果它和 = 运算符一起使用, 则它会在变量中保存两个原义的引号字符.</p>
<p><strong>获取变量的内容</strong>: 如果赋值的两种方法, 获取变量的内容也有两种方法: 传统方法和表达式方法. 传统方法需要将变量名包围在百分号中来获取变量的内容. 例如:</p>
<pre><a href="commands/MsgBox.htm">MsgBox</a> The value in the variable named Var is %Var%.
CopyOfVar = %Var%</pre>
<p>与之相比, 表达式方法省去了变量名两边的百分号, 但原义的字符串必须包围在双引号中. 所以下面的表达式作用与上面的例子是一样的:</p>
<pre>MsgBox <strong>%</strong> "The value in the variable named Var is " . Var . "."  <em>; 使用句点连接两个字符串.</em>
CopyOfVar := Var</pre>
<p>在上面的 MsgBox 这行, 使用一个百分号和一个空格把参数从传统模式改变为表达式模式. 因为所有的命令默认情况下使用传统模式 (除了那些另外注明的), 所以这是必须的. 不过, 某些命令的特定参数已注明接受表达式, 此时前导的百分号允许使用但不是必须的. 例如, 所有下面的命令都是等效的, 因为 <a href="commands/Sleep.htm">Sleep</a> 的首个参数可以是表达式:</p>
<pre>Sleep MillisecondsToWait
Sleep %MillisecondsToWait%
Sleep % MillisecondsToWait</pre>
<p><strong>变量的比较</strong>: 请阅读下面的表达式部分关于不同类型变量比较的重要提示, 尤其关于何时使用小括号的内容.</p>
<h2 id="Expressions">表达式</h2>
<p>表达式可以用来对一系列变量, 原义字符串和/或原义数字执行一个或多个操作.</p>
<p>表达式中的变量名称不用包围在百分号中 (除了数组和其他的 <a href="#ref">双重引用</a>). 所以, 为了与变量区别, 原义的字符串必须用双引号包围. 例如:</p>
<pre>if (CurrentSetting &gt; 100 or FoundColor &lt;&gt; &quot;Blue&quot;)
    MsgBox The setting is too high or the wrong color is present.</pre>
<p>在上面的例子中, "Blue" 出现在双引号中, 因为它是一个原义字符串. 要在原义字符串中含有一个 <em>真实的</em> 双引号, 指定两个连续的引号, 如同此例中的两次演示: "She said, <span class="red">""</span>An apple a day.<span class="red">""</span>"</p>
<p><strong>重要说明</strong>: 包含有表达式的 if 语句与 <a href="commands/IfEqual.htm">传统的 if 语句</a> 例如 <em>If FoundColor &lt;&gt; Blue</em> 可以通过单词 "if" 后是否有开括号来区分. 尽管通常是把整个表达式包围在括号中, 但也可以像这样写 <em>if (x &gt; 0) and (y &gt; 0)</em>. 此外, 如果单词 "if" 后的第一项为 <a href="Functions.htm">函数调用</a> 或类似 "not" 或 "!" 这样的运算符时, 开括号可以完全省略.</p>
<p><strong>空字符串</strong>: 要在表达式中指定一个空字符串, 使用一对空引号. 例如, 当 <em>MyVar</em> 非空时语句 <em>if (MyVar &lt;&gt; "")</em> 中的表达式结果则为真. 然而, 在 <a href="commands/IfEqual.htm">传统的 if 语句</a> 中, 一对空引号会被当成原义的字符串. 例如, 仅当 <em>MyVar</em> 包含一对真实的引号时 <em>if MyVar = ""</em> 中的表达式结果才为真. 因此要在传统的 if 语句中判断一个变量为空, 让 = 或 &lt;&gt; 的右侧为空, 例如: <em>if Var =</em></p>
<p>相关提示, 任何无效的表达式例如 (x +* 3) 会产生一个空字符串.</p>
<p><strong>保存表达式的结果</strong>: 要把结果赋值给变量, 使用 <a href="commands/SetExpression.htm">:= 运算符</a>. 例如:</p>
<pre>NetPrice := Price * (1 - Discount/100)</pre>
<p><strong>布尔值</strong>: 需要计算出一个表达式结果为真还是假时 (例如 IF 语句), 表达式结果为空或零被视为假, 而其他所有结果都视为真. 例如, 仅当 ItemCount 为空或 0 时 "if ItemCount" 中的表达式结果才为假. 类似地, 表达式 "if not ItemCount" 将产生相反的结果.</p>
<p>含有这些运算符例如 NOT/AND/OR/&gt;/=/&lt; 的运算会自动产生一个真值或假值: 真值时结果为 1 而假值时为 0. 例如, 在下面的表达式中, 如果任一条件为真则变量 <em>Done</em> 被赋值为 1:</p>
<pre>Done := A_Index &gt; 5 or FoundIt</pre>
<p>如同上面提示的那样, 简单地置空变量或为其赋值为 0 可以让此变量保持假值. 利用这个, 可以使用简写语句 "if Done" 检查变量 Done 是真还是假.</p>
<p><a name="True"></a><a name="False"></a>单词 <em>true</em> 和 <em>false</em> 是分别包含 1 和 0 的内置变量. 使用它们可以让脚本更具有可读性, 例如:</p>
<pre>CaseSensitive := false
ContinueSearch := true</pre>
<p><strong>整数和浮点数</strong>: 在表达式中, 含有一个小数点的数字被视为浮点数; 否则视为整数. 对于绝大多数运算符 -- 例如加和乘 -- 只要其中一个输入是浮点数, 那么结果也将是浮点数.</p>
<p>不论在表达式中还是表达式外的其他地方, 整数都可以写为十六进制或十进制. 十六进制数必须以前缀 0x 开头. 例如, <em>Sleep 0xFF</em> 等同于 <em>Sleep 255</em>. 在 1.0.46.11+ 版本中, 可以识别科学计数法表示的浮点数; 但仅在它们含有小数点时才行 (例如 1<strong>.</strong>0e4 and -2<strong>.</strong>1E-4).</p>
<p><strong>强制使用表达式</strong>: 通过在表达式前加上一个百分号和一个空格或 tab, 能把表达式用在不直接支持表达式 (除了那些像 <a href="commands/StringLen.htm">StringLen</a> 命令的 OutputVar 或 InputVar 参数) 的参数中. 这种技巧常用来访问 <a href="misc/Arrays.htm">数组</a>. 例如:</p>
<pre><a href="commands/FileAppend.htm">FileAppend</a>, <strong>%</strong> MyArray%i%, My File.txt
<a href="commands/MsgBox.htm">MsgBox</a> <strong>%</strong> "The variable MyVar contains " . MyVar . "."
<a href="commands/Loop.htm">Loop</a> <strong>%</strong> Iterations + 1
<a href="commands/WinSet.htm">WinSet</a>, Transparent, <strong>%</strong> X + 100
<a href="commands/WinSet.htm">Control</a>, Choose, <strong>%</strong> CurrentSelection - 1</pre>
<h2 id="Operators">表达式中的运算符</h2>
<p> 优先级相同的运算符例如乘 (*) 和除 (/) 按从左到右的顺序计算, 下面另行注明的除外. 与之相比, 低优先级的运算符例如加 (+) 在更高优先级的运算符例如乘 (*) <em>之后</em> 计算. 例如, 3 + 2 * 2 等价于 3 + (2 * 2). 可以使用括号超越优先级, 例如: (3 + 2) * 2</p>
<p>除了下面注明的, 其他时候在数学运算中包含的任何空值 (空字符串) 都 <strong>不会</strong> 被假定为零. 作为替代, 它被视为一个错误, 这将导致那部分的表达式计算结果为空字符串. 例如, 如果变量 X 为空, 表达式 X+1 会产生一个空值而不是 1.</p>
<h3>表达式运算符 (以优先级降序排列)</h3>
<table class="info">
  <tr>
    <td align="center"><strong>%Var%</strong></td>
    <td><p><a name="ref"></a>在表达式中如果一个变量被百分号包围 (例如 %Var%), 不管此变量 <u>包含</u> 什么其内容都会被假定为另一个变量 (如果不存在这样的变量, 则把 %Var% 解析为一个空字符串) 的名称或部分名称. 这种方法通常用来引用 <a href="misc/Arrays.htm">数组</a> 元素, 例如:</p>
      <p>Var := MyArray%A_Index% + 100</p>      
      <p>这样的引用不应该 <u>为</u> 一个 <a href="#env">环境变量</a>, 剪贴板或任何 <a href="#BuiltIn">保留/只读的变量</a>. 如果是, 则它被当成一个空字符串. 并且, 为了向后兼容, 注明了 "可以使用表达式" 的命令行参数把百分号中的孤立名称 (例如 %Var%, 但不是 Array%i%) 当作其两边的百分号不存在一样. 通过把引用包围在百分号中避免这种情况; 例如 <em>Sleep (%Var%)</em></p></td>
  </tr>
  <tr>
    <td align="center">x<strong>.</strong>y</td>
    <td><span class="ver">[AHK_L 31+]:</span> <strong>对象访问</strong>. 从对象 <i>x</i> 中取值或为其存入值或调用其方法, 这里的 <i>y</i> 是个原义值. 参见 <a href="Objects.htm#SyntaxInvoke">对象的语法</a>.</td>
  </tr>
  <tr>
    <td align="center"><strong>++<br>
    --</strong></td>
    <td><strong><a name="IncDec"></a>前置和后置的自增/自减</strong>. 将变量增加或减去 1 (但在 1.0.46 之前的版本中, 只有把它们放在一行中才能用; 此行中不能使用其他运算符). 此运算符可以放在变量名的前面或后面. 如果把它放在变量名的 <em>前面</em>, 自增运算立即执行并且把结果用于后面的运算. 例如, <em>Var := ++X</em> 让 X 立即自增然后把它的值赋给 <em>Var</em>. 相反地, 如果运算符放在变量名的 <em>后面</em>, 在后面的运算使用了变量 <em>之后</em> 才对其进行自增运算. 例如, <em>Var := X++</em> 把 X 的当前值赋给 <em>Var</em> 后才进行自增. 由于向后兼容性, 仅在空变量在单独一行时运算符 ++ 和 -- 才把它们视为零; 例如, <em>y:=1, ++x</em> 和 <em>MsgBox % ++x</em> 当 x 为空时都得到空的结果.</td>
  </tr>
  <tr>
    <td align="center"><strong>**</strong></td>
    <td><a name="pow"></a><strong>幂</strong>. 底数和指数都可以为小数. 如果指数为负数, 即使底数和指数都为整数, 结果也将被格式化为浮点数. 因为 ** 的优先级高于一元负号, 所以 -2**2 的计算过程和 -(2**2) 一样得到结果 -4. 要让负号的优先级高于幂运算, 把它包围在括号中例如 (-2)**2. 注意: 不支持底数为负数且指数为分数例如 (-2)**0.5 的情况; 它将产生一个空字符串. 但 (-2)**2 和 (-2)**2.0 都是支持的.</td>
  </tr>
  <tr>
    <td align="center"><strong>-<br>
    !<br>
    ~<br>
    &amp; *</strong></td>
    <td><p><strong><a name="unary"></a>一元负号 (-)</strong>: 尽管它和减运算符使用相同的符号, 但一元负号仅应用于单项或子表达式, 如果此例中的两次演示: <em><strong>-</strong>(3 / <strong>-</strong>x)</em>. 相关提示, 表达式中的任何一元正号 (+) 都被忽略.</p>
      <p><strong>逻辑非 (!)</strong>: 如果运算数为空或 0, 则逻辑非的结果为 1, 这表示 "true". 否则结果为 0 (false). 例如: <em>!x or !(y and z)</em>. 注意: 单词 NOT 和 <strong>!</strong> 的含义相同, 但 <strong>!</strong> 优先级更高. 在 1.0.46+ 版本中, 允许使用连续的一元运算符例如 <em><strong>!!</strong>Var</em>, 因为它们是按从右到左的顺序计算.</p>
      <p><strong>按位非 (~)</strong>: 此运算符对运算数按位取反. 如果运算数为浮点数, 则在计算前把它截取成整数. 如果运算数介于 0 和 4294967295 (0xffffffff) 之间, 它将被视为 <u>无符号的</u> 32 位值. 否则, 它被视为 <u>有符号的</u> 64 位值. 例如, ~0xf0f 计算结果为 0xfffff0f0 (4294963440).</p>
      <p><a name="amp"></a><strong>取址 (&amp;)</strong>: <em>&amp;MyVar</em> 获取 <em>MyVar</em> 的内容的内存地址, 此地址一般和 <a href="commands/DllCall.htm#struct">DllCall 结构体</a> 一起使用. 同时 <em>&amp;MyVar</em> 也禁用了此变量中二进制数的缓存, 如果它经常用于数学或数值比较则这会拖慢其性能. 每当一个变量的地址改变时其缓存会重新启用 (例如通过 <a href="commands/VarSetCapacity.htm">VarSetCapacity()</a>).</p>
      <p><strong>解除引用 (*)</strong>: <em>*Expression </em>假定 <em>Expression</em> 解析为一个数值的内存地址; 它会获取在一个介于 0 和 255 之间的数字表示的内存地址中一个字节的内容 (地址为 0 时, 获取的结果也总是 0; 但应该避免使用其他任何无效地址, 因为它可能会让脚本崩溃). 然而, 获取二进制数时 <a href="Functions.htm#NumGet">NumGet()</a> 通常执行的更好.</p></td>
  </tr>
  <tr>
    <td align="center"><strong>*<br>
    /<br>
    // </strong></td>
    <td><p><strong>乘 (*)</strong>: 如果两个输入都为整数则结果为整数; 否则结果为浮点数.</p>
      <p><a name="divide"></a><strong>真除 (/)</strong>: 与 <a href="commands/EnvDiv.htm">EnvDiv</a> 不同, 即使两个输入都是整数真除也会得到浮点数的结果. 例如, 3/2 结果为 1.5 而不是 1, 而 4/2 结果为 2.0 而不是 2.</p>
      <p><strong><a name="FloorDivide"></a>向下舍除 (//)</strong>: 如果两个输入都是整数, 双斜线运算符使用高效的整数除法. 例如, 5//3 结果为 1 而 5//-3 结果为 -1. 如果任何一个输入为浮点数, 则执行浮点除法并把结果往下取整到最近的整数. 例如, 5//3.0 结果为 1.0 而 5.0//-3 结果为 -2.0. 尽管浮点除法的结果为整数, 但它被保存为浮点格式, 以便其它使用者能使用浮点格式. 关于求模运算, 参见 <a href="Functions.htm#Mod">mod()</a>.</p>
    <p> <a href="commands/EnvMult.htm">*=</a> 和 <a href="commands/EnvDiv.htm">/=</a> 运算符是用变量的值乘以或除以另一个值的一种简写形式. 例如, <em>Var*=2</em> 和 <em>Var:=Var*2</em> 得到相同的结果 (不过前者执行的更好).</p>
    <p>除数为零时得到一个空结果 (空字符串).</p></td>
  </tr>
  <tr>
    <td align="center"><strong>+<br>
    - </strong></td>
    <td><p><strong>加 (+)</strong> 和 <strong>减 (-)</strong>. 相关提示, <a href="commands/EnvAdd.htm"><strong>+=</strong></a> 和 <a href="commands/EnvSub.htm"><strong>-=</strong></a> 运算符是增加或减小变量的值的一种简写形式. 例如, <em>Var+=2</em> 和 <em>Var:=Var+2</em> 得到相同的结果 (不过前者执行的更好). 同样地,, 使用 <a href="#IncDec">Var++, Var--, ++Var</a> 或 <a href="#IncDec">--Var</a> 可以让变量增加或减小 1.</p>
    </td>
  </tr>
  <tr>
    <td align="center"><strong>&lt;&lt;<br>
    &gt;&gt; </strong></td>
    <td><a name="bitwise"></a><strong>按位左移 (&lt;&lt;)</strong> 和 <strong>右移 (&gt;&gt;)</strong>. 用法示例: <em>Value1 &lt;&lt; Value2</em>. 任何浮点数在计算前会被截取成整数. 左移 (<strong>&lt;&lt;</strong>) 相当于把 <em>Value1</em> 乘以 "2 的 <em>Value2</em> 次幂". 右移 (<strong>&gt;&gt;</strong>) 相当于把 <em>Value1</em> 除以 "2 的 <em>Value2</em> 次幂" 并把结果往下取整到最近的整数; 例如, -3&gt;&gt;1 结果为 -2.</td>
  </tr>
  <tr>
    <td align="center"><strong>&amp;<br>
      ^<br>
      | </strong></td>
    <td><strong>按位与 (&amp;)</strong>, <strong>按位异或 (^)</strong> 和 <strong>按位或 (|)</strong>. 这三个运算符中, <strong>&amp;</strong> 的优先级最高而 <strong>|</strong> 的优先级最低. 任何浮点数在计算前会被截取成整数.</td>
  </tr>
  <tr>
    <td align="center"><strong>.</strong></td>
    <td><p><a name="concat"></a><strong>连接</strong>. 句点运算符用于把两个项目组合成单个字符串 (在句点的两边至少必须有一个空格). 你也可以省略句点达到相同的目的 (除非表达式中有不明确的关系例如 <em>x <strong>-</strong>y</em> 或在右边的项目含有前导的 ++ 或 -- 运算符时). 省略句点时, 在合并的两个项目间应该至少有一个空格.<br>
      示例 (表达式方法): Var := "The color is " <strong>.</strong> FoundColor<br>
      示例 (传统方法): &nbsp;Var = The color is %FoundColor%</p>
        <p> 还可以用来连接子表达式. 例如: <em>Var := "The net price is " <strong>.</strong> Price * (1 - Discount/100)</em></p>
        <p>以句点 (或任何其他运算符) 开始的行会自动 <a href="Scripts.htm#continuation">附加到</a> 前一行的末尾.</p></td>
  </tr>
  <tr>
    <td align="center"><strong>&gt;&nbsp;&nbsp;&nbsp;&lt;<br>
    &gt;= &lt;=</strong></td>
    <td><strong>大于 (&gt;)</strong>, <strong>小于 (&lt;)</strong>, <strong>大于或等于 (&gt;=)</strong> 和 <strong>小于或等于 (&lt;=)</strong>. 如果任何一个输入都不是数字, 则按字母顺序比较 (被引号包围的原义字符串例如 "55" 在这种情况中总是被当成是非数值的). 仅当 <a href="commands/StringCaseSense.htm">StringCaseSense</a> 打开时, 比较才区分大小写. 也请参见: <a href="commands/Sort.htm">Sort</a></td>
  </tr>
  <tr>
    <td align="center"><strong>=<br>
      ==<br>
    &lt;&gt; != </strong></td>
    <td><a name="equal"></a><strong>等于 (=) </strong>, <strong>区分大小写等于 (==) </strong> 和 <strong>不等于 (&lt;&gt;</strong> 或 <strong>!=)</strong>. 运算符 <strong>!=</strong> 和 <strong>&lt;&gt;</strong> 的功能是完全一样的. 当两个输入都是数字时, 运算符 <strong>==</strong> 和 <strong>=</strong> 是一样的, 当某个输入不是数字时, <strong>==</strong> 总是区分大小写而 <strong>=</strong> 总是不区分大小写 (不区分大小写的方法由 <a href="commands/StringCaseSense.htm">StringCaseSense</a> 决定). 与之相比, <strong>&lt;&gt;</strong> 和 <strong>!=</strong> 都服从于 <a href="commands/StringCaseSense.htm">StringCaseSense</a> 的设置. 注意: 被引号包围的原义字符串例如 "55" 在这种情况下总是被当成非数值的.</td>
  </tr>
  <tr>
    <td align="center"><strong>NOT</strong></td>
    <td><strong>逻辑非</strong>. 除了优先级低于 <strong>!</strong> 运算符, 其他的与其相同. 例如, <em>not (x = 3 or y = 3)</em> 等同于<em> <strong>!</strong>(x = 3 or y = 3)</em></td>
  </tr>
  <tr>
    <td align="center"><strong>AND<br>
    &amp;&amp; </strong></td>
    <td>这两个运算符都是 <strong>逻辑与</strong>. 例如: <em>x &gt; 3 and x &lt; 10</em>. 要提高性能, 要应用 <a href="Functions.htm#ShortCircuit">求值优化</a>. 此外, 以 AND/OR/&amp;&amp;/|| (或任何其他运算符) 开始的行会自动 <a href="Scripts.htm#continuation">附加到</a> 前一行的末尾.</td>
  </tr>
  <tr>
    <td align="center"><strong>OR<br>
    || </strong></td>
    <td>这两个运算符都是 <strong>逻辑或</strong>. 例如: <em>x &lt;= 3 or x &gt;= 10</em>. 要提高性能, 要应用 <a href="Functions.htm#ShortCircuit">求值优化</a>.</td>
  </tr>
  <tr>
    <td align="center"><strong>?:<br>
      </strong></td>
    <td><a name="ternary"></a><strong>三元运算符</strong> <span class="ver">[v1.0.46+]</span>. 此运算符是 <a href="commands/IfExpression.htm">if-else 语句</a> 的简写形式. 它计算它左边的条件来确定两个分支中哪个作为最终结果. 例如, <strong><em>var := x&gt;y ? 2 : 3</em></strong> 当 x 大于 y 时保存 2 到 <em>Var</em>; 否则保存 3. 为了提高性能, 只计算决定性的分支 (参见 <a href="Functions.htm#ShortCircuit">求值优化</a>). <strong>注意</strong>: 由于兼容性的原因, 此运算符中问号的两边至少必须有一个空格 (此问题可能会在未来的版本中解决).</td>
  </tr>
  <tr>
    <td align="center"><strong>:=<br>
        +=<br>
        -=<br>
        *=<br>
        /=<br>
        //=<br>
        .=<br>
        |=<br>
        &=<br>
        ^=<br>
        >>=<br>
        <<=<br>
      </strong>
 </td>
    <td><p><strong><a name="AssignOp"></a>赋值</strong>. 对变量的内容执行运算然后把结果保存到同一个变量中 (但在 1.0.46 之前的版本中, 这些运算符只能在一行中最左边使用, 并且仅支持前五个运算符). 最简单的赋值运算符为 <a href="commands/SetExpression.htm">冒号等号 (:=)</a>, 它把表达式的结果保存到变量中. 关于其他运算符的功能描述, 参见这个表格中它们的相关条目. 例如, <em>Var //= 2</em> 执行 <a href="#FloorDivide">向下舍除</a>, 把 <em>Var</em> 除以 2, 然后把结果保存回 <em>Var</em>. 同样地, <em>Var <strong>.=</strong> "abc"</em> 为 <em>Var := Var <strong>.</strong> "abc"</em> 的一种简写形式.</p>
      <p>与其他大多数运算符不同, 赋值运算是从右到左执行的. 因此, 这个语句中 <em>Var1 := Var2 := 0</em> 首先把 0 赋值给 <em>Var2</em> 然后把 <em>Var2</em> 赋值给 <em>Var1</em>.</p>      
    <p>如果使用一个赋值运算作为其他某些运算符的输入, 那么输入的值就是变量自身. 例如, 如果变量 <em>Var</em> 新增值后大于 50, 那么表达式 <em>(Var+=2) &gt; 50</em> 结果为真. 这样也使得可以把赋值运算作为 <a href="Functions.htm#ByRef">ByRef,</a> 传递或取得其 <a href="#amp">地址</a>; 例如: <em>&amp;(x:="abc")</em>.</p>
    <p>需要避免语法错误或提供更直观的操作时, 赋值运算符的优先级会被自动提升. 例如: <em>not x:=y</em> 等价于 <em>not (x:=y)</em>. 同样地, <em>++Var := X</em> 等价于 <em>++(Var := X)</em>; 而 <em> Z&gt;0 ? X:=2 : Y:=2</em> 等价于 <em>Z&gt;0 ? (X:=2) : (Y:=2)</em></p>
    <p>由向后兼容性引起的已知限制 (可能会在未来的版本中解决): 1) 当 <strong>/=</strong> 为表达式中最左边的运算符并且它不是 <a href="#comma">多语句表达式</a> 的一部分时, 它执行 <a href="#FloorDivide">向下舍除</a> 除非其中的一个输入是浮点数 (在其他所有情况中, <strong>/=</strong> 执行 <a href="#divide">真除</a>); 2) 仅当 <strong>+=</strong> 或 <strong>-=</strong> 为一行中最左边的运算符时, 它们才支持 <a href="commands/EnvAdd.htm">日期/时间的计算</a>; 3) 运算符 <strong>+=</strong>, <strong>-=</strong> 和 *= 仅在空变量在单独一行时才把它们视为零; 例如, <em>y:=1, x+=1</em> 和 <em>MsgBox % x-=3</em> 当 x 为空时都得到空的结果.</p></td>
  </tr>
  <tr>
    <td align="center"><strong>,</strong></td>
    <td><p><strong><a name="comma"></a>逗号 (多语句)</strong> <span class="ver">[v1.0.46+]</span>. 逗号可以用来在单行中书写多个子表达式. 最常用于把多个赋值或函数调用聚集在一起. 例如: <em>x:=1<strong>,</strong> y+=2<strong>,</strong> ++index, func()</em>. 这样的语句按从左到右的语句执行. 注意: 以逗号 (或任何其他运算符) 开始的行会自动 <a href="Scripts.htm#continuation">附加到</a> 前一行的末尾. 也请参见: <a href="#CommaPerf">逗号的性能</a>.</p>
      <p>在 1.0.46.01+ 版本中, 当逗号后面紧跟着一个变量和一个等号时, 则这个等号会被自动当成一个 <a href="commands/SetExpression.htm">赋值 (:=)</a>. 例如, 下列的所有都是赋值: <em>x:=1, y=2, a=b=c</em></p></td>
  </tr>
  <tr>
    <td align="center"><p><strong>mod()<br>
        round()<br>
    abs()</strong></p>      </td>
    <td>这些和其他内置数学函数在 <a href="Functions.htm#Math">这里</a> 阐述.</td>
  </tr>
  <tr>
    <td>F(<i>p</i><strong>*</strong>)</td>
    <td><span class="ver">[AHK_L 60+]:</span> 参见 <a href="Functions.htm#Variadic">可变参数函数</a>.</td>
  </tr>
  <tr>
    <td>x<strong>[</strong>y<strong>]</strong></td>
    <td><span class="ver">[AHK_L 31+]:</span> <strong>对象访问</strong>. 从对象 <i>x</i> 中取值或为其存入值或调用其方法, 这里的 <i>y</i> 是个参数列表. 参见 <a href="Objects.htm#SyntaxInvoke">对象的语法</a>.</td>
  </tr>
</table>
<p><strong><br>
    性能</strong>: <a href="commands/SetExpression.htm">表达式赋值运算符 (:=)</a> 已经优化, 所以在类似下列的简单情况中可以执行得和非表达式运算符 (<a href="commands/SetEnv.htm">=</a>) 一样快速:</p>
<pre>x := y  <em>; 性能等同于 x = %y%</em>
x := 5  <em>; 性能等同于 x = 5.</em>
x := "literal string"  <em>; 性能等同于 x = literal string.</em></pre>
<p><a name="CommaPerf" id="CommaPerf"></a>在 1.0.48+ 版本中, 使用逗号运算符常常比分开写单独的表达式速度更快, 尤其是当把一个变量的值赋给另一个变量时 (例如 x:=y, a:=b). 当越多的表达式联合成单个表达式时, 性能会持续得到提升; 例如, 把五个或十个简单的表达式联合成单个表达式速度可能提升 35%.</p>

<h2 id="BuiltIn">内置变量</h2>
<p>下列变量内置于程序中, 并可以在任何脚本中引用. 除了 <a href="misc/Clipboard.htm">Clipboard</a>, <a href="misc/ErrorLevel.htm">ErrorLevel</a> 和 <a href="#CommandLine">命令行参数</a>, 其他变量都是只读的; 即它们的内容在脚本中无法直接修改.</p>
<h3>目录</h3>
<ul>
  <li>特殊字符: <a href="#Space">A_Space</a>, <a href="#Tab">A_Tab</a></li>
  <li>脚本属性: <a href="#CommandLine">命令行参数</a>, <a href="#WorkingDir">A_WorkingDir</a>, <a href="#ScriptDir">A_ScriptDir</a>, <a href="#ScriptName">A_ScriptName</a>, <a href="#prop">(...更多...)</a></li>
  <li>日期和时间: <a href="#YYYY">A_YYYY</a>, <a href="#MM">A_MM</a>, <a href="#DD">A_DD</a>, <a href="#Hour">A_Hour</a>, <a href="#Min">A_Min</a>, <a href="#Sec">A_Sec</a>, <a href="#date">(...更多...)</a></li>
  <li>脚本设置: <a href="#IsSuspended">A_IsSuspended</a>, <a href="#BatchLines">A_BatchLines</a>, <a href="#TitleMatchMode">A_TitleMatchMode</a>, <a href="#settings">(...更多...)</a> </li>
  <li>用户空闲时间: <a href="#TimeIdle">A_TimeIdle</a>, <a href="#TimeIdlePhysical">A_TimeIdlePhysical</a></li>
  <li>GUI 窗口和菜单栏: <a href="#Gui">A_Gui</a>, <a href="#GuiControl">A_GuiControl</a>, <a href="#GuiEvent">A_GuiEvent</a>, <a href="#EventInfo">A_EventInfo</a></li>
  <li>热键, 热字串和自定义菜单项: <a href="#ThisHotkey">A_ThisHotkey</a>, <a href="#EndChar">A_EndChar</a>, <a href="#ThisMenuItem">A_ThisMenuItem</a>, <a href="#h">(...更多...)</a></li>
  <li>操作系统和用户信息: <a href="#OSVersion">A_OSVersion</a>, <a href="#Screen">A_ScreenWidth</a>, <a href="#Screen">A_ScreenHeight</a>, <a href="#os">(...更多...)</a></li>
  <li>杂项: <a href="#Cursor">A_Cursor</a>, <a href="#Caret">A_CaretX</a>, <a href="#Caret">A_CaretY</a>, <a href="misc/Clipboard.htm">Clipboard</a>, <a href="misc/Clipboard.htm#ClipboardAll">ClipboardAll</a>, <a href="misc/ErrorLevel.htm">ErrorLevel</a></li>
  <li>循环: <a href="#Index">A_Index</a>, <a href="#loop">(...更多...)</a></li>
</ul>
<h3>特殊字符</h3>
<table class="info">
  <tr>
    <td>A_Space</td>
    <td><a name="Space"></a>此变量包含了单个空格字符. 参见 <a href="commands/AutoTrim.htm">AutoTrim</a> 了解详情.</td>
  </tr>
  <tr>
    <td>A_Tab</td>
    <td><a name="Tab"></a>此变量包含单个 tab 字符. 参见 <a href="commands/AutoTrim.htm">AutoTrim</a> 了解详情.</td>
  </tr>
</table>
<h3 id="prop">脚本属性</h3>
<table class="info">
  <tr>
    <td>1, 2, 3, 等. </td>
    <td><a name="CommandLine"></a>每当脚本带命令行参数启动时, 这些变量被自动创建. 它们可以像正常变量一样被修改和引用 (例如: %1%). 变量 %0% 包含了命令行参数的数目 (如果没有则为 0). 需了解详情参见 <a href="Scripts.htm#cmd">命令行参数</a>.</td>
  </tr>
  <tr>
    <td>A_WorkingDir</td>
    <td><a name="WorkingDir"></a>脚本的当前工作目录, 这是脚本访问文件的默认路径. 除非是根目录, 否则路径末尾不包含反斜线. 两个示例: C:\ 和 C:\My Documents. 可以使用 <a href="commands/SetWorkingDir.htm">SetWorkingDir</a> 改变工作目录.</td>
  </tr>
  <tr>
    <td>A_ScriptDir</td>
    <td><a name="ScriptDir"></a>当前脚本所在目录的绝对路径. 为了向后兼容 AutoIt v2, <strong>只为 .aut 脚本包含</strong> 路径末尾的反斜线 (甚至根目录也是如此). 一个对应于 <strong>.aut</strong> 脚本的示例: C:\My Documents\</td>
  </tr>
  <tr>
    <td>A_ScriptName</td>
    <td><a name="ScriptName"></a>当前脚本的文件名称, 不含路径, 例如 MyScript.ahk.</td>
  </tr>
  <tr>
    <td>A_ScriptFullPath</td>
    <td><a name="ScriptFullPath"></a>上面两个变量的组合, 包含了当前脚本的完整文件描述, 例如 C:\My Documents\My Script.ahk</td>
  </tr>
  <tr>
    <td>A_LineNumber</td>
    <td><p><a name="LineNumber"></a>当前脚本中正在执行的行所在的行号 (或其 <a href="commands/_Include.htm">#Include 文件</a> 的行号). 这里的行号与 <a href="commands/ListLines.htm">ListLines</a> 显示的一致; 它在错误报告时比较有用, 例如: MsgBox Could not write to log file (line number %A_LineNumber%).</p>
    <p>  由于 <a href="Scripts.htm#ahk2exe">已编译脚本</a> 已经把其所有的 <a href="commands/_Include.htm">#Include 文件</a> 合并成一个大脚本, 它的行号可能与它在未编译模式运行时不一样.</p></td>
  </tr>
  <tr>
    <td>A_LineFile</td>
    <td><a name="LineFile"></a><a href="#LineNumber">A_LineNumber</a> 所属文件的完整路径和名称, 除非当前行属于未编译脚本的某个 <a href="commands/_Include.htm">#Include 文件</a>, 否则它将和 <a href="#ScriptFullPath">A_ScriptFullPath</a> 一样.</td>
  </tr>
  <tr>
    <td>A_ThisFunc<br>
    <span class="ver">[v1.0.46.16+]</span></td>
    <td><a name="ThisFunc"></a>当前正在执行的 <a href="Functions.htm">自定义函数</a> 的名称 (没有则为空); 例如: MyFunction. 也请参见: <a href="Functions.htm#IsFunc">IsFunc()</a> </td>
  </tr>
  <tr>
    <td>A_ThisLabel<br>
    <span class="ver">[v1.0.46.16+]</span></td>
    <td><a name="ThisLabel"></a>当前正在执行的标签 (子程序) 的名称 (没有则为空); ; 例如: MyLabel. 每当脚本执行 <a href="commands/Gosub.htm">Gosub</a>/<a href="commands/Return.htm">Return</a> 或 <a href="commands/Goto.htm">Goto</a> 时, 会更新此变量的值. 执行自动调用的标签例如 <a href="commands/SetTimer.htm">计时器</a>, <a href="commands/Gui.htm#DefaultWin">GUI 线程</a>, <a href="commands/Menu.htm">菜单项</a>, <a href="Hotkeys.htm">热键</a>, <a href="Hotstrings.htm">热字串</a>, <a href="misc/Clipboard.htm#OnClipboardChange">OnClipboardChange</a> 和 <a href="commands/OnExit.htm">OnExit</a> 时也会更新此变量的值, 不过, 当执行从前面的语句 "进入" 一个标签时 A_ThisLabel 的值不会更新; 此时 A_ThisLabel 还是保持原来的值. 也请参见: <a href="#ThisHotkey">A_ThisHotkey</a> 和 <a href="Functions.htm#IsLabel">IsLabel()</a> </td>
  </tr>
  <tr>
    <td>A_AhkVersion</td>
    <td><a name="AhkVersion"></a>在 1.0.22 之前的版本中, 此变量为空. 否则它包含了运行当前脚本的 AutoHotkey 主程序的版本号, 例如 1.0.22. 在 <a href="Scripts.htm#ahk2exe">已编译脚本</a> 中, 它包含了原来编译时使用的主程序版本号. 格式化的版本号使得脚本可以使用 &gt; 或 &gt;= 检查 A_AhkVersion 是否大于某个最小的版本号, 例如: if A_AhkVersion &gt;= 1.0.25.07</td>
  </tr>
  <tr>
    <td>A_AhkPath</td>
    <td><p><a name="AhkPath"></a>对于未编译脚本: 实际运行当前脚本的 EXE 文件的完整路径和名称. 例如: C:\Program Files\AutoHotkey\AutoHotkey.exe</p>
    <p>对于 <a href="Scripts.htm#ahk2exe">已编译脚本</a>: 除了通过注册表条目 <em>HKEY_LOCAL_MACHINE\SOFTWARE\AutoHotkey\InstallDir</em> 获取 AutoHotkey 目录外, 其他的和上面相同. 如果找不到这样的注册表条目, 则 A_AhkPath 为空.</p></td>
  </tr>
  <tr>
  <tr>
    <td>A_IsUnicode</td>
    <td><a name="IsUnicode"></a>在 Unicode 版本中, 此变量值为 1 (真). 在 ANSI 版本中此变量未定义, 所以实际上为假.</td>
  </tr>
  <tr>
    <td>A_IsCompiled</td>
    <td><a name="IsCompiled"></a>如果当前运行的脚本为 <a href="Scripts.htm#ahk2exe">已编译 EXE</a> 时此变量值为 1, 否则为空.</td>
  </tr>
  <tr>
    <td>A_ExitReason</td>
    <td><a name="ExitReason"></a>最近一次要求脚本退出的原因. 除非脚本含有 <a href="commands/OnExit.htm">OnExit</a> 子程序并且此子程序当前正在运行或被退出尝试至少调用过一次, 否则此变量为空. 参见 <a href="commands/OnExit.htm">OnExit</a> 了解详情.</td>
  </tr>
</table>
<h3 id="date">日期和时间</h3>
<table class="info">
  <tr>
    <td>A_YYYY</td>
    <td><a name="YYYY"></a>4 位数表示的当前年份 (例如 2004). 与 A_Year 含义相同. 注意: 要获取一个适应于你区域设置和语言的格式化的时间或日期, 使用 "<a href="commands/FormatTime.htm">FormatTime</a>, OutputVar" (时间和长日期) 或 "<a href="commands/FormatTime.htm">FormatTime</a>, OutputVar,, LongDate" (获取长格式日期).</td>
  </tr>
  <tr>
    <td>A_MM</td>
    <td><a name="MM"></a>2 位数表示的当前月份 (01-12). 与 A_Mon 含义相同.</td>
  </tr>
  <tr>
    <td>A_DD</td>
    <td><a name="DD"></a>2 位数表示的当前月份的日期  (01-31). 与 A_MDay 含义相同.</td>
  </tr>
  <tr>
    <td>A_MMMM</td>
    <td><a name="MMMM"></a>使用当前用户语言表示的当前月份的全称, 例如 July</td>
  </tr>
  <tr>
    <td>A_MMM</td>
    <td><a name="MMM"></a>使用当前用户语言表示的当前月份的简称, 例如 Jul</td>
  </tr>
  <tr>
    <td>A_DDDD</td>
    <td><a name="DDDD"></a>使用当前用户语言表示的当前星期几的全称, 例如 Sunday</td>
  </tr>
  <tr>
    <td>A_DDD</td>
    <td><a name="DDD"></a>使用当前用户语言表示的当前星期几的 3 个字母的简称, 例如 Sun</td>
  </tr>
  <tr>
    <td>A_WDay</td>
    <td><a name="WDay"></a>1 位数表示的当前星期经过的天数 (1-7). 在所有的区域设置中 1 都表示星期天.</td>
  </tr>
  <tr>
    <td>A_YDay</td>
    <td><a name="YDay"></a>当前年份中经过的天数 (1-366). 不会使用零对变量的值进行填充, 例如 取得 9, 而不是 009. 要对变量的值进行零填充, 使用: <a href="commands/FormatTime.htm">FormatTime</a>, OutputVar, , YDay0 </td>
  </tr>
  <tr>
    <td>A_YWeek</td>
    <td><a name="YWeek"></a>符合 ISO 8601 标准的当前的年份和周数 (例如 200453). 要让年份和周数分离, 使用 <em><a href="commands/StringLeft.htm">StringLeft</a>, Year, A_YWeek, 4</em> 和 <em><a href="commands/StringLeft.htm">StringRight</a>, Week, A_YWeek, 2</em>. A_YWeek 的准确定义为: 如果含有新年一月一号的那个星期有四天或更多天, 则它被认为是新年的第一个星期. 否则它为前一年的最后一个星期, 而下一星期为新年的第一星期.</td>
  </tr>
  <tr>
    <td>A_Hour</td>
    <td><a name="Hour"></a>在 24 小时制中以 2 位数表示的当前小时数 (00-23)(例如, 17 表示 5pm). 要获取 12 小时制带 AM/PM 提示的时间, 参照此例: <a href="commands/FormatTime.htm">FormatTime</a>, OutputVar, , h:mm:ss tt </td>
  </tr>
  <tr>
    <td>A_Min</td>
    <td><p><a name="Min"></a>2 位数表示的当前分钟数 (00-59).</p>    </td>
  </tr>
  <tr>
    <td>A_Sec</td>
    <td><a name="Sec"></a>2 位数表示的当前秒数 (00-59).</td>
  </tr>
  <tr>
    <td>A_MSec</td>
    <td><a name="MSec"></a>3 位数表示的当前毫秒数 (000-999). 要移除前导零, 参照此例: Milliseconds := A_MSec + 0</td>
  </tr>
  <tr>
    <td>A_Now</td>
    <td><a name="Now"></a><a href="commands/FileSetTime.htm#YYYYMMDD">YYYYMMDDHH24MISS</a> 格式的本地区域时间. 注意: 使用 <a href="commands/EnvAdd.htm">EnvAdd</a> 和 <a href="commands/EnvSub.htm">EnvSub</a> 可以对日期和时间进行计算. 此外, 使用 <a href="commands/FormatTime.htm">FormatTime</a> 可以根据你的区域设置或选项来格式化日期和/或时间.</td>
  </tr>
  <tr>
    <td>A_NowUTC</td>
    <td><a name="NowUTC"></a><a href="commands/FileSetTime.htm#YYYYMMDD">YYYYMMDDHH24MISS</a> 格式的本地通用协调时间 (UTC). UTC 基本上和格林威治标准时间 (GMT) 一致.</td>
  </tr>
  <tr>
    <td>A_TickCount</td>
    <td><p><a name="TickCount"></a>计算机重启后经过的毫秒数. 通过把 A_TickCount 保存到一个变量中, 经过一段时间后从最新的 A_TickCount 值中减去那个变量, 这样可以计算出经过的时间. 例如:</p>
        <pre>StartTime := A_TickCount
Sleep, 1000
ElapsedTime := A_TickCount - StartTime
MsgBox,  %ElapsedTime% milliseconds have elapsed.</pre>
<p>如果你需要比 A_TickCount 的 10 毫秒更高的精确度, 使用 <a href="commands/DllCall.htm#QPC">QueryPerformanceCounter()</a>.</p>
</td>
  </tr>
</table>
<h3 id="settings">脚本设置</h3>
<table class="info">
  <tr>
    <td>A_IsSuspended</td>
    <td><a name="IsSuspended"></a>当前脚本 <a href="commands/Suspend.htm">挂起时</a> 值为 1, 否则为 0.</td>
  </tr>
  <tr>
    <td>A_IsPaused<br>
    <span class="ver">[v1.0.48+]</span></td>
    <td><a name="IsPaused"></a>当紧随当前线程的 <a href="misc/Threads.htm">线程</a> 被 <a href="commands/Pause.htm">暂停</a> 时值为 1. 否则为 0.</td>
  </tr>
  <tr>
    <td>A_IsCritical<br>
    <span class="ver">[v1.0.48+]</span></td>
    <td><a name="IsCritical"></a>当 <a href="misc/Threads.htm">当前线程</a> 的 <a href="commands/Critical.htm">Critical</a> 设置为 off 时值为 0. 否则它的值为一个大于零的整数, 即 Critical 使用的 <a href="commands/Critical.htm#Interval">消息检查频率</a>. 由于 "Critical 0" 关闭了当前线程的关键性, Critical 的当前状态可以这样来保存和恢复: <em>Old_IsCritical := A_IsCritical</em>, 后来执行 <em>Critical %Old_IsCritical%</em></td>
  </tr>
  <tr>
    <td>A_BatchLines</td>
    <td><a name="BatchLines"></a>(同义于 A_NumBatchLines) 由 <a href="commands/SetBatchLines.htm">SetBatchLines</a> 设置的当前值. 示例: 200 或 10ms (取决于格式).</td>
  </tr>
  <tr>
    <td>A_TitleMatchMode</td>
    <td><a name="TitleMatchMode"></a>由 <a href="commands/SetTitleMatchMode.htm">SetTitleMatchMode</a> 设置的当前模式: 1, 2, 3 或 RegEx.</td>
  </tr>
  <tr>
    <td>A_TitleMatchModeSpeed</td>
    <td><a name="TitleMatchModeSpeed"></a>由 <a href="commands/SetTitleMatchMode.htm">SetTitleMatchMode</a> 设置的当前匹配速度 (fast 或 slow).</td>
  </tr>
  <tr>
    <td>A_DetectHiddenWindows</td>
    <td><a name="DetectHiddenWindows"></a>由 <a href="commands/DetectHiddenWindows.htm">DetectHiddenWindows</a> 设置的当前模式 (On 或 Off).</td>
  </tr>
  <tr>
    <td>A_DetectHiddenText</td>
    <td><a name="DetectHiddenText"></a>由 <a href="commands/DetectHiddenText.htm">DetectHiddenText</a> 设置的当前模式 (On 或 Off).</td>
  </tr>
  <tr>
    <td>A_AutoTrim</td>
    <td><a name="AutoTrim"></a>由 <a href="commands/AutoTrim.htm">AutoTrim</a> 设置的当前模式 (On 或 Off). </td>
  </tr>
  <tr>
    <td>A_StringCaseSense</td>
    <td><a name="StringCaseSense"></a>由 <a href="commands/StringCaseSense.htm">StringCaseSense</a> 设置的当前模式 (On, Off 或 Locale). </td>
  </tr>
  <tr>
    <td>A_FileEncoding</td>
    <td><a name="FileEncoding"></a><span class="ver">[AHK_L 46+]</span> 包含了多种命令使用的默认编码; 参见 <a href="commands/FileEncoding.htm">FileEncoding</a>.</td>
  </tr>
  <tr>
    <td>A_FormatInteger</td>
    <td><a name="FormatInteger"></a>由 <a href="commands/SetFormat.htm">SetFormat</a> 设置的当前整数格式 (H 或 D). <span class="ver">[AHK_L 42+]:</span> 此变量还可能为小写形式 h.</td>
  </tr>
  <tr>
    <td>A_FormatFloat</td>
    <td><a name="FormatFloat"></a>由 <a href="commands/SetFormat.htm">SetFormat</a> 设置的当前浮点数格式. </td>
  </tr>
  <tr>
    <td>A_KeyDelay</td>
    <td><a name="KeyDelay"></a>由 <a href="commands/SetKeyDelay.htm">SetKeyDelay</a> 设置的当前延迟 (总是十进制数, 不是十六进制). 此延迟适用于传统的 SendEvent 模式, 不适用于 <a href="commands/Send.htm#SendPlayDetail">SendPlay</a>.</td>
  </tr>
  <tr>
    <td>A_WinDelay</td>
    <td><a name="WinDelay"></a>由 <a href="commands/SetWinDelay.htm">SetWinDelay</a> 设置的当前延迟 (总是十进制数, 不是十六进制).</td>
  </tr>
  <tr>
    <td>A_ControlDelay</td>
    <td><a name="ControlDelay"></a>由 <a href="commands/SetControlDelay.htm">SetControlDelay</a> 设置的当前延迟 (总是十进制数, 不是十六进制).</td>
  </tr>
  <tr>
    <td>A_MouseDelay</td>
    <td><a name="MouseDelay"></a>由 <a href="commands/SetMouseDelay.htm">SetMouseDelay</a> 设置的当前延迟 (总是十进制数, 不是十六进制). 此延迟适用于传统的 SendEvent 模式, 不适用于 <a href="commands/Send.htm#SendPlayDetail">SendPlay</a>.</td>
  </tr>
  <tr>
    <td>A_DefaultMouseSpeed</td>
    <td><a name="DefaultMouseSpeed"></a>由 <a href="commands/SetDefaultMouseSpeed.htm">SetDefaultMouseSpeed</a> 设置的当前速度 (总是十进制数, 不是十六进制).</td>
  </tr>
  <tr>
    <td>A_IconHidden</td>
    <td><a name="IconHidden"></a>托盘图标当前隐藏时值为 1, 否则为 0. 此图标可以通过 <a href="commands/_NoTrayIcon.htm">#NoTrayIcon</a> 或 <a href="commands/Menu.htm">Menu</a> 命令进行隐藏.</td>
  </tr>
  <tr>
    <td>A_IconTip</td>
    <td><a name="IconTip"></a>除非使用 <em><a href="commands/Menu.htm"><em>Menu</em></a><em></em>, Tray, Tip </em> 为托盘图标指定了一个自定义的提示 -- 此时变量的值为这个提示的文本, 否则为空. </td>
  </tr>
  <tr>
    <td>A_IconFile</td>
    <td><a name="IconFile"></a>除非使用 <a href="commands/Menu.htm"><em>Menu</em></a><em>, tray, icon</em> 指定了一个自定义的托盘图标 -- 此时变量的值为这个图标文件的完整路径和名称, 否则为空.</td>
  </tr>
  <tr>
    <td>A_IconNumber</td>
    <td><a name="IconNumber"></a>当 A_IconFile 为空时此变量为空. 否则, 它的值为 A_IconFile 中的图标编号 (通常为 1).</td>
  </tr>
</table>
<h3>用户空闲时间 </h3>
<table class="info">
  <tr>
    <td>A_TimeIdle</td>
    <td><a name="TimeIdle"></a>从系统最后一次接收到键盘, 鼠标或其他输入后所经过的毫秒数. 这在用来判断用户是否离开很有用. 除非操作系统为 Windows 2000, XP 或更高版本的系统, 否则此变量将为空. 用户的物理输入和由 <strong>任意</strong> 程序或脚本 (例如 <a href="commands/Send.htm">Send</a> 或 <a href="commands/MouseMove.htm">MouseMove</a> 命令) 会将此变量重置为零. 由于此变量的值倾向于以 10 的增量增加, 所以判断它是否等于另一个值是没有意义的. 作为替代, 检查此变量是否大于或小于另一个值. 例如: IfGreater, A_TimeIdle, 600000, MsgBox, The last keyboard or mouse activity was at least 10 minutes ago. </td>
  </tr>
  <tr>
    <td>A_TimeIdlePhysical</td>
    <td><p><a name="TimeIdlePhysical"></a>与上面类似, 但在安装了相应的钩子 (<a href="commands/_InstallKeybdHook.htm">键盘</a> 或 <a href="commands/_InstallMouseHook.htm">鼠标</a>) 时会忽略模拟的键击和/或鼠标点击; 即此变量仅反应物理事件. (这样就可以避免由于模拟键击和鼠标点击而误以为用户存在.) 如果两种钩子都没有安装, 此变量相当于 A_TimeIdle. 如果仅安装一种钩子, 那么仅此类型的物理输入才会对 A_TimeIdlePhysical 起作用 (另一种/未安装钩子的输入, 包括物理和模拟的, 都被忽略).</p>    </td>
  </tr>
</table>
<h3>GUI 窗口和菜单栏</h3>
<table class="info">
  <tr>
    <td>A_Gui</td>
    <td><a name="Gui"></a>启动了 <a href="misc/Threads.htm">当前线程</a> 的 <a href="commands/Gui.htm">GUI</a> 窗体编号. 除非当前线程是由一个 Gui 控件, 菜单项或 Gui 事件例如 GuiClose/GuiEscape 启动的, 否则此变量为空.</td>
  </tr>
  <tr>
    <td>A_GuiControl</td>
    <td><a name="GuiControl"></a>启动了 <a href="misc/Threads.htm">当前线程</a> 的 GUI 控件的关联变量名. 如果那个控件没有 <a href="commands/Gui.htm#Events">关联变量</a>, 则 A_GuiControl 包含此控件的文本/标题中前 63 个字符 (这常用来避免给每个按钮分配一个变量名). 出现后面这些情况时 A_GuiControl 为空: 1) A_Gui 为空; 2) 一个 GUI 菜单项或 GUI 事件例如 GuiClose/GuiEscape 启动了当前线程; 3) 那个控件没有关联变量同时没有标题; 或 4) 最初启动当前线程的控件已经不存在 (可能由于 <a href="commands/Gui.htm#Destroy">Gui Destroy</a> 的原因).</td>
  </tr>
  <tr>
    <td><a name="GuiWidth"></a>A_GuiWidth<br>
    A_GuiHeight</td>
    <td>在 <a href="commands/Gui.htm#GuiSize">GuiSize 子程序</a> 中引用时, 它们分别包含了 GUI 窗体的宽度和高度. 它们适用于窗体客户区, 这是窗体中不包括标题栏, 菜单栏和边框的部分.</td>
  </tr>
  <tr>
    <td><a name="GuiX"></a><a name="GuiY" id="GuiY"></a>A_GuiX<br>
    A_GuiY</td>
    <td>它们分别包含了 <a href="commands/Gui.htm#GuiContextMenu">GuiContextMenu</a> 和 <a href="commands/Gui.htm#GuiDropFiles">GuiDropFiles</a> 事件中的 X 和 Y 坐标. 这里的坐标相对于窗体的左上角.</td>
  </tr>
  <tr>
    <td>A_GuiEvent<br><span class="small80">或 A_GuiControlEvent</span></td>
    <td><p><a name="GuiControlEvent"></a><a name="GuiEvent"></a>启动了 <a href="misc/Threads.htm"></a><a href="misc/Threads.htm"></a> <a href="misc/Threads.htm">当前线程</a> 的事件类型. 如果当前线程不是由 <a href="commands/Gui.htm">GUI 动作</a> 启动的, 则此变量为空. 否则, 它为下列字符串的其中之一:</p>
      <p><strong>Normal</strong>: 此事件是由左键单击和键击 (方向键, TAB 键, 空格, 带下划线的快捷键等) 触发的. 此变量的值还可以用于菜单项和特殊的 Gui 事件例如 GuiClose 和 GuiEscape.</p>
      <p><strong>DoubleClick</strong>: 此事件是由双击触发的. 注意: 双击中的首次点击仍会引起 <em>Normal</em> 事件先被获取. 换句话说, 双击时子程序将运行两次: 一次在首次点击时, 再次是在第二次点击时.</p>
      <p><strong>RightClick</strong>: 仅出现在 <a href="commands/Gui.htm#GuiContextMenu">GuiContextMenu</a>, <a href="commands/ListView.htm">ListView</a> 和 <a href="commands/TreeView.htm">TreeView</a>.</p>
      <p><strong>Context-sensitive values: </strong>了解详情参见 <a href="commands/Gui.htm#GuiContextMenu">GuiContextMenu</a>, <a href="commands/Gui.htm#GuiDropFiles">GuiDropFiles</a>, <a href="commands/GuiControls.htm#Slider">Slider</a>, <a href="commands/GuiControls.htm#MonthCal">MonthCal</a>, <a href="commands/ListView.htm">ListView</a> 和 <a href="commands/TreeView.htm">TreeView</a>.</p>
    </td>
  </tr>
  <tr>
    <td>A_EventInfo</td>
    <td><p><a name="EventInfo"></a>包含下列事件的额外信息:</p>
      <ul>
        <li><a href="misc/Clipboard.htm#OnClipboardChange">OnClipboardChange 标签</a></li>
        <li><a href="Hotkeys.htm#Wheel">鼠标滚轮热键</a> (WheelDown/Up/Left/Right)</li>
        <li><a href="commands/RegisterCallback.htm">RegisterCallback()</a></li>
        <li><a href="commands/Gui.htm#label">GUI 时间</a>, 即 <a href="commands/Gui.htm#GuiContextMenu">GuiContextMenu</a>, <a href="commands/Gui.htm#GuiDropFiles">GuiDropFiles</a>, <a href="commands/GuiControls.htm#ListBox">ListBox</a>, <a href="commands/ListView.htm">ListView</a>, <a href="commands/TreeView.htm">TreeView</a> 和 <a href="commands/GuiControls.htm#StatusBar">StatusBar</a>. 如果一个事件没有额外的信息, A_EventInfo 的值为 0.</li>
      </ul></td>
  </tr>
</table>
<p>注意: 与变量例如 A_ThisHotkey 不同, 每个 <a href="misc/Threads.htm">线程</a> 会为 A_Gui, A_GuiControl, A_GuiX/Y, A_GuiEvent 和 A_EventInfo 保存它自己本身的值. 因此, 如果一个线程被另一个中断, 在这个线程恢复时它仍将看到这些变量的原来/正确的值.</p>
<h3 id="h">热键, 热字串和自定义菜单项 </h3>
<table class="info">
  <tr>
    <td>A_ThisMenuItem</td>
    <td><a name="ThisMenuItem"></a>最近选择的 <a href="commands/Menu.htm">自定义菜单项</a> 的名称 (没有则为空).</td>
  </tr>
  <tr>
    <td>A_ThisMenu</td>
    <td><a name="ThisMenu"></a>A_ThisMenuItem 所在菜单的名称.</td>
  </tr>
  <tr>
    <td>A_ThisMenuItemPos</td>
    <td><a name="ThisMenuItemPos"></a>一个表示 A_ThisMenuItem 在 A_ThisMenu <u>当前</u> 位置的编号. 菜单中的首个项目为 1, 第二项为 2 等等. 菜单分隔线也计算在内. 如果 A_ThisMenuItem 为空或已不存在于 A_ThisMenu 中, 则此变量为空. 如果 A_ThisMenu 已不存在则此变量也为空.</td>
  </tr>
  <tr>
    <td>A_ThisHotkey</td>
    <td><p><a name="ThisHotkey"></a>最近执行的 <a href="Hotkeys.htm">热键</a> 或 <a href="Hotstrings.htm">非自动替换热字串</a> 的按键名称 (没有则为空), 例如 #z. 如果 <a href="misc/Threads.htm">当前线程</a> 被其他热键中断, 那么这个变量的值会变化, 所以如果之后需要在一个子程序中使用原来的值, 则必须马上把它复制到另一个变量中.</p>
      <p>当首次创建一个热键时 -- 通过 <a href="commands/Hotkey.htm">Hotkey 命令</a> 或脚本中的 <a href="Hotkeys.htm">双冒号标签</a> -- 其键名以及修饰符的顺序成为此热键的固定名称. 也请参见: <a href="#ThisLabel">A_ThisLabel</a></p></td>
  </tr>
  <tr>
    <td>A_PriorHotkey</td>
    <td><a name="PriorHotkey"></a>除了保存前一次热键的名称外, 其他的同上. 如果没有它将为空. </td>
  </tr>
  <tr>
    <td>A_TimeSinceThisHotkey</td>
    <td><a name="TimeSinceThisHotkey"></a>从 A_ThisHotkey 按下后到现在经过的毫秒数. 如果 A_ThisHotkey 为空则此变量的值为 -1.</td>
  </tr>
  <tr>
    <td>A_TimeSincePriorHotkey</td>
    <td><a name="TimeSincePriorHotkey"></a>从 A_PriorHotkey 按下后到现在经过的毫秒数. 如果 A_PriorHotkey 为空则此变量的值为 -1.</td>
  </tr>
  <tr>
    <td>A_EndChar</td>
    <td><a name="EndChar"></a>用户最近按下的触发了 <a href="Hotstrings.htm">非自动替换热字串</a> 的 <a href="Hotstrings.htm#EndChars">终止符</a>. 如果不需要终止符 (使用了 * 选项), 此变量将为空.</td>
  </tr>
</table>
<h3 id="os">操作系统和用户信息 </h3>
<table class="info">
  <tr>
    <td>ComSpec<br>
    <span class="ver">[v1.0.43.08+]</span></td>
    <td><a name="ComSpec" id="ComSpec"></a>此变量的值与系统环境变量 ComSpec 一样 (例如 C:\Windows\system32\cmd.exe). 常与 <a href="commands/Run.htm">Run/RunWait</a> 一起使用. 注意: 此变量不带 A_ 前缀.</td>
  </tr>
  <tr>
    <td>A_Temp<br>
    <span class="ver">[v1.0.43.09+]</span></td>
    <td><a name="Temp"></a>存放临时文件的文件夹的完整路径和名称 (例如 C:\DOCUME~1\UserName\LOCALS~1\Temp). 它的值从下列的其中一个位置获取 (按顺序): 1) <a href="#env">环境变量</a> TMP, TEMP 或 USERPROFILE; 2) Windows 目录. 在 Windows 9x 系统中, 如果 TMP 和 TEMP 都不存在则使用 <a href="#WorkingDir">A_WorkingDir</a> 的值.</td>
  </tr>
  <tr>
    <td>A_OSType</td>
    <td> <a name="OSType"></a>当前运行的操作系统类型.&nbsp; WIN32_WINDOWS (即 Windows 95/98/ME) 或 WIN32_NT (即 Windows NT4/2000/XP/2003/Vista).</td>
  </tr>
  <tr>
    <td>A_OSVersion</td>
    <td> <p><a name="OSVersion"></a>下列字符串的其中之一: WIN_7 <span class="ver">[需要 AHK_L 42+]</span>, WIN_VISTA <span class="ver">[需要 v1.0.44.13+]</span>, WIN_2003, WIN_XP, WIN_2000, WIN_NT4, WIN_95, WIN_98, WIN_ME. 例如:</p>
      <pre>if A_OSVersion in WIN_NT4,WIN_95,WIN_98,WIN_ME  <em>; 注意: 逗号两边没有空格.</em>
{
    MsgBox This script requires Windows 2000/XP or later.
    ExitApp
}</pre></td>
  </tr>
  <tr>
    <td>A_PtrSize</td>
    <td><a name="PtrSize"></a><span class="ver">[AHK_L 42+]:</span> 包含指针的大小值, 单位为字节. 值为 4 (32-位) 或 8 (64-位).</td>
  </tr>
  <tr>
  <tr>
    <td>A_Language</td>
    <td><a name="Language"></a>当前系统的默认语言, 值为 <a href="misc/Languages.htm">这些 4 位数字编码</a> 的其中一个.</td>
  </tr>
  <tr>
    <td>A_ComputerName</td>
    <td><a name="ComputerName"></a>网络上可以看到的当前计算机的名称. </td>
  </tr>
  <tr>
    <td>A_UserName</td>
    <td><a name="UserName"></a>运行当前脚本的用户的登录名. </td>
  </tr>
  <tr>
    <td>A_WinDir</td>
    <td><a name="WinDir"></a>Windows 目录. 例如: C:\Windows</td>
  </tr>
  <tr>
    <td>A_ProgramFiles<br>
    或 ProgramFiles</td>
    <td><a name="ProgramFiles"></a>Program Files 目录 (例如 C:\Program Files). 在 1.0.43.08+ 版本中, 前缀 A_ 可以省略, 这样有助于自然过渡到 <a href="commands/_NoEnv.htm">#NoEnv</a>.</td>
  </tr>
  <tr>
    <td>A_AppData<br>
    <span class="ver">[v1.0.43.09+]</span></td>
    <td><a name="AppData"></a>当前用户的应用程序数据文件夹的完整路径和名称. 例如: C:\Documents and Settings\Username\Application Data</td>
  </tr>
  <tr>
    <td>A_AppDataCommon<br>
    <span class="ver">[v1.0.43.09+]</span></td>
    <td><a name="AppDataCommon"></a>所有用户的应用程序数据文件夹的完整路径和名称.</td>
  </tr>
  <tr>
    <td>A_Desktop</td>
    <td><a name="Desktop"></a>当前用户桌面文件夹的完整路径和名称.</td>
  </tr>
  <tr>
    <td>A_DesktopCommon</td>
    <td><a name="DesktopCommon"></a>所有用户的桌面文件夹的完整路径和名称.</td>
  </tr>
  <tr>
    <td>A_StartMenu</td>
    <td><a name="StartMenu"></a>当前用户开始菜单文件夹的完整路径和名称.</td>
  </tr>
  <tr>
    <td>A_StartMenuCommon</td>
    <td><a name="StartMenuCommon"></a>所有用户开始菜单文件夹的完整路径和名称.</td>
  </tr>
  <tr>
    <td>A_Programs</td>
    <td><a name="Programs"></a>当前用户开始菜单中程序文件夹的完整路径和名称.</td>
  </tr>
  <tr>
    <td>A_ProgramsCommon</td>
    <td><a name="ProgramsCommon"></a>所有用户开始菜单中程序文件夹的完整路径和名称.</td>
  </tr>
  <tr>
    <td>A_Startup</td>
    <td><a name="Startup"></a>当前用户开始菜单中启动文件夹的完整路径和名称.</td>
  </tr>
  <tr>
    <td>A_StartupCommon</td>
    <td><a name="StartupCommon"></a>所有用户开始菜单中启动文件夹的完整路径和名称.</td>
  </tr>
  <tr>
    <td>A_MyDocuments</td>
    <td><a name="MyDocuments"></a>当前用户 "我的文档" 文件夹的完整路径和名称. 与大多数类似变量不同, 当此文件夹为驱动器的根目录时, 此变量的值不包含最后的反斜线. 例如, 它的值为 M: 而不是 M:\</td>
  </tr>
  <tr>
    <td>A_IsAdmin</td>
    <td><p><a name="IsAdmin"></a>如果当前用户有管理员权限, 则此变量值为 1. 否则为 0. 在 Windows 95/98/Me 系统中, 此变量的值总是为 1.</p>
    <p><a name="RequireAdmin" id="RequireAdmin"></a>在 Windows Vista 或更高版本的系统中, 一些脚本可能要求管理员权限才能正常运行 (例如与使用管理员权限执行的进程和窗口进行交互的脚本). 为了实现此目的, 把下列语句添加到脚本的顶部:</p>
    <pre>if not A_IsAdmin
{
   Run *RunAs "%A_ScriptFullPath%"  <em>; 需要 AHK_L 57+</em>
   ExitApp
}</pre></td>
  </tr>
  <tr>
    <td><p>A_ScreenWidth<br>
    A_ScreenHeight</p>    </td>
    <td><p><a name="Screen"></a>主显示器的宽度和高度, 单位为像素 (例如 1024 和 768).</p>
      <p>要获取多显示器系统中其他显示器的尺寸, 使用 <a href="commands/SysGet.htm">SysGet</a>.</p>
      <p>获取整个桌面 (即使它横跨多个显示器) 的宽度和高度的替代方法, 使用下面的例子 (不过在 Windows 95/NT 系统上, 下面的两个变量都会被设置为 0):<br>
      <a href="commands/SysGet.htm">SysGet</a>, VirtualWidth, 78<br>
      <a href="commands/SysGet.htm">SysGet</a>, VirtualHeight, 79</p>
    <p>此外, 使用 <a href="commands/SysGet.htm">SysGet</a> 可以获取显示器的工作区域, 它比显示器的整个区域小, 因为它不包括任务栏和其他注册的桌面工具栏.</p></td>
  </tr>
  <tr>
    <td>A_IPAddress1 到 4 </td>
    <td><a name="IPAddress"></a>计算机中前 4 个网卡的 IP 地址.</td>
  </tr>
</table>
<h3>杂项.</h3>
<table class="info">
  <tr>
    <td>A_Cursor</td>
    <td><p><a name="Cursor"></a>当前显示的鼠标指针类型. 其值为下列单词的其中之一: AppStarting, Arrow, Cross, Help, IBeam, Icon, No, Size, SizeAll, SizeNESW, SizeNS, SizeNWSE, SizeWE, UpArrow, Wait, Unknown. 与 Size 指针类型一起的首字母表示方向, 例如 NESW = NorthEast+SouthWest. 手形指针 (点击和抓取) 属于 Unknown 类别.</p>
      <p>Windows 95 系统中已知限制: 如果以很高频率 (例如每隔 500 ms 或更快) 重复获取此变量的内容, 这样将会干扰用户双击鼠标. 没有已知的解决方法.<br>
    </p></td>
  </tr>
  <tr>
    <td>A_CaretX<br>
    A_CaretY</td>
    <td><p><a name="Caret"></a>当前文本插入点的 X 和 Y 坐标. 如果没有使用 <a href="commands/CoordMode.htm">CoordMode</a> 使得坐标相对于整个屏幕, 默认坐标相对于活动窗口. 如果没有活动窗口或无法确定文本插入点的位置, 这两个变量为空.</p>
      <p>下面这个脚本可以让你四出移动文本插入点来查看显示在自动更新提示上的当前位置. 注意在某些窗口 (例如某些版本的 MS Word) 会不管文本插入点的实际位置如何都报告同样的位置.</p>
      <p>#Persistent<br>
        SetTimer, WatchCaret, 100<br>
        return<br>
        WatchCaret:<br>
        ToolTip, X%A_CaretX% Y%A_CaretY%, A_CaretX, A_CaretY - 20<br>
      return</p>
      <p>如果以很高频率 (例如每隔 500 ms 或更快) 重复获取这些变量的内容, 这样将会干扰用户双击鼠标. 没有已知的解决方法.</p></td>
  </tr>
  <tr>
    <td>Clipboard</td>
    <td>操作系统剪贴板的内容, 可以被读取或写入. 参见 <a href="misc/Clipboard.htm">Clipboard</a> 部分.</td>
  </tr>
  <tr>
    <td>ClipboardAll</td>
    <td>整个剪贴板的内容 (例如格式和文本). 参见 <a href="misc/Clipboard.htm#ClipboardAll">ClipboardAll</a>.</td>
  </tr>
  <tr>
    <td>返回值</td>
    <td>参见 <a href="misc/ErrorLevel.htm">ErrorLevel</a>.</td>
  </tr>
  <tr>
    <td>A_LastError</td>
    <td><a name="LastError"></a>操作系统 GetLastError() 函数或最近的 COM 对象调用返回的结果. 要了解详情, 参见 <a href="commands/DllCall.htm#LastError">DllCall()</a> 和 <a href="commands/Run.htm#LastError">Run/RunWait</a>.</td>
  </tr>
</table>
<h3 id="loop">循环</h3>
<table class="info">
  <tr>
    <td>A_Index</td>
    <td><a name="Index"></a>当前循环重复的次数 (64 位整数). 例如, 当脚本首次执行此循环体时, 此变量的值为 1. 要了解详情参见 <a href="commands/Loop.htm">Loop</a> 或 <a href="commands/While.htm">While-loop</a>.</td>
  </tr>
  <tr>
    <td>A_LoopFileName 等 </td>
    <td>此变量和其他相关变量仅在 <a href="commands/LoopFile.htm">文件循环</a> 中有效.</td>
  </tr>
  <tr>
    <td>A_LoopRegName 等 </td>
    <td>此变量和其他相关变量仅在 <a href="commands/LoopReg.htm">注册表循环</a> 中有效.</td>
  </tr>
  <tr>
    <td>A_LoopReadLine</td>
    <td>参见 <a href="commands/LoopReadFile.htm">文件读取循环</a>.</td>
  </tr>
  <tr>
    <td>A_LoopField</td>
    <td>参见 <a href="commands/LoopParse.htm">解析循环</a>. </td>
  </tr>
</table>

<h2 id="env">环境变量与 "普通" 变量</h2>
<p>环境变量由操作系统维护. 在命令提示符中输入 SET 并回车后, 你可以看到环境变量列表.</p>
<p>脚本中可以使用 <a href="commands/EnvSet.htm">EnvSet</a> 创建新的环境变量或改变现有环境变量的内容. 但是, 这样的添加和改变都是私有的; 它们不能被系统的其他部分看到. 一个例外是当脚本使用 <a href="commands/Run.htm">Run</a> 或 <a href="commands/Run.htm">RunWait</a> 运行程序时 (甚至是另一个脚本); 这样的程序会继承其父脚本的环境变量的副本, 包括私有的那些.</p>
<p>在 1.0.43.08+ 版本中, 推荐所有新脚本使用以下方式获取环境变量例如 <em>Path</em>:</p>
<pre><a href="commands/EnvGet.htm">EnvGet, OutputVar, Path</a>  <em>; 想了解含义, 参见 <a href="commands/_NoEnv.htm">#NoEnv</a>.</em></pre>
<h2 id="cap">变量的容量和占用内存</h2>
<ul>
  <li>每个变量最多可以含有 64 MB 的文本 (使用 <a href="commands/_MaxMem.htm">#MaxMem</a> 可以增加这个限制).</li>
  <li>当赋值给变量比当前更长的内容时, 会自动分配额外的系统内容给这个变量.</li>
  <li>一个大变量占用的内存可以通过赋值为空来释放占用的内存, 例如 var := ""</li>
  <li>一个脚本可以创建的变量数量没有限制. 程序设置用来至少支持几百万的变量而不会出现明显的性能下降.</li>
  <li>接受数值输入的命令, 函数和表达式通常可以支持 15 位的浮点数精度. 对于整数, 可以支持 64 位有符号整数, 其范围从 -9223372036854775808 (-0x8000000000000000) 到 9223372036854775807 (0x7FFFFFFFFFFFFFFF). 此范围之外的任何整数不被支持并可能产生错误的结果. 与之相比, 整数的算术运算结果超出此范围会产生溢出 (例如 0x7FFFFFFFFFFFFFFF + 1 = -0x8000000000000000).</li>
</ul>
</body>
</html>
